package services

import (
	"errors"
	"time"

	"github.com/inntu/backend/api/models"
	"github.com/inntu/backend/config"
	"github.com/inntu/backend/utils/password"
	"gorm.io/gorm"
)

// UserService 用户服务
type UserService struct {
	db *gorm.DB
}

// NewUserService 创建用户服务实例
func NewUserService() *UserService {
	return &UserService{
		db: config.GetGormDB(),
	}
}

// Login 用户登录
func (s *UserService) Login(username, passwordInput string) (*models.User, error) {
	var user models.User
	
	// 查询用户
	err := s.db.Where("username = ? AND status = 1", username).First(&user).Error
	if err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, errors.New("用户不存在或已禁用")
		}
		return nil, err
	}
	
	// 验证密码（使用bcrypt加密比较）
	if !password.CheckPasswordHash(passwordInput, user.Password) {
		return nil, errors.New("密码错误")
	}
	
	// 更新最后登录时间
	now := time.Now()
	user.LastLogin = &now
	s.db.Model(&user).Update("last_login", now)
	
	return &user, nil
}

// GetUserByID 根据ID获取用户
func (s *UserService) GetUserByID(id uint) (*models.User, error) {
	var user models.User
	err := s.db.Where("id = ?", id).First(&user).Error
	if err != nil {
		return nil, err
	}
	return &user, nil
}

// GetUsers 获取用户列表
func (s *UserService) GetUsers() ([]models.User, error) {
	var users []models.User
	err := s.db.Find(&users).Error
	if err != nil {
		return nil, err
	}
	return users, nil
}

// CreateUser 创建用户
func (s *UserService) CreateUser(user *models.User) error {
	// 对密码进行加密
	hashedPassword, err := password.HashPassword(user.Password)
	if err != nil {
		return err
	}
	user.Password = hashedPassword
	return s.db.Create(user).Error
}

// UpdateUser 更新用户
func (s *UserService) UpdateUser(user *models.User) error {
	// 如果更新了密码，需要对新密码进行加密
	if user.Password != "" {
		// 检查密码是否已经是加密格式
		if len(user.Password) < 60 { // bcrypt哈希通常长度为60
			hashedPassword, err := password.HashPassword(user.Password)
			if err != nil {
				return err
			}
			user.Password = hashedPassword
		}
	}
	return s.db.Save(user).Error
}

// DeleteUser 删除用户
func (s *UserService) DeleteUser(id uint) error {
	return s.db.Delete(&models.User{}, id).Error
}